package com.io.review;

import org.junit.Test;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ReviewDemo01 {
    public static void main(String[] args) {
        // 创建file对象
        File file = new File("E:\\test\\ymb.txt");
        try {
            if (file.createNewFile()) {
                System.out.println("创建成功！");
            } else {
                System.out.println("创建失败！");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void mode()
    {
        // 创建方式二
        File filePath = new File("E:\\test");
        File file = new File(filePath, "haha.txt");
        try {
            if (file.createNewFile()) {
                System.out.println("创建成功！");
            } else {
                System.out.println("创建失败！");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        /**
         * String src = "E:\\test\\messi.jpeg";
         *         String target = "E:\\test\\2022\\2.png";
         *         File file = new File(src);
         *         File fileTarget = new File(target);
         *         // 移动
         *         boolean b = file.renameTo(fileTarget);
         *         if (b) {
         *             System.out.println("移动成功！");
         *         } else {
         *             // 移动失败
         *             System.out.println("移动失败");
         *         }
         */
    }

    @Test
    public void getInfo()
    {
        File filePath = new File("E:\\test");
        File file = new File(filePath, "haha.txt");
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getPath());
        // 判断文件是否存在
        if (file.exists()) {
            System.out.println("文件已经存在");
        } else {
            System.out.println("文件不存在");
        }
        // 判断是文件还是目录
        if (file.isFile()) {
            System.out.println("是文件");
        } else {
            if (file.isDirectory()) {
                System.out.println("是目录");
            } else {
                System.out.println("啥也不是");
            }
        }
        // 文件删除操作
        if (file.delete()) {
            System.out.println("文件删除成功！");
        } else {
            System.out.println("文件删除失败！");
        }
    }

    @Test
    public void auth() throws IOException {
        // 读写执行等权限
        File file = new File("E:\\test\\ymb.txt");
        System.out.println(file.canRead()); // true
        System.out.println(file.canWrite()); // true
        System.out.println(file.canExecute()); // true
        // 创建目录
        File filePath = new File("E:\\test\\2022");
        if (!filePath.exists()) {
            // 不存在就创建操作
            boolean mkdir = filePath.mkdir();
            if (mkdir) {
                System.out.println("创建成功！");
            }
        }
        // 批量创建文件
        for (int i = 0; i < 5; i++) {
            File fileTxt = new File(filePath, i + ".txt");
            if (fileTxt.createNewFile()) {
                System.out.println("创建成功！"+i);
            } else {
                System.out.println("创建失败！");
            }
        }
    }

    @Test
    public void move()
    {
        String src = "E:\\test\\xxhaha.txt";
        String target = "E:\\test\\2022\\xxhaha.txt";
        File file = new File(src);
        File move = new File(target);
        // 移动文件
        boolean b = file.renameTo(move);
        if (b) {
            System.out.println("移动成功！");
        } else {
            System.out.println("移动失败！");
        }
    }

    @Test
    public void lists()
    {
        String target = "E:\\test\\2022";
        File file = new File(target);
        // 目录文件
        String[] list = file.list();
        for (String s : list) {
            System.out.println(s);
        }
        System.out.println("--------------");
        // 过滤获取文件 只获取 bat结尾的文件
        File[] files = file.listFiles((dir, name) -> {
            return name.endsWith(".bat");
        });
        for (File f : files) {
            System.out.println(f.getName());
        }
    }

    @Test
    public void flow(){
        // 写入：输出流（java程序 写入 文件）
        // 读取：输入流（java程序 读取 文件）
        /**
         * 输出流：字节、字符流
         * 输入流：字节、字符流
         * 节点流、处理流
         * 字节输入流：
         * InputStream（带有前缀）
         * -
         */
        // 读取一个文件内容 文本 - 字符输入流
        String src= "E:\\test\\hello.txt";
        FileReader fileReader = null;
        try {
            fileReader = new FileReader(src);
            // 读取内容
            char[] chars = new char[1024];
            int len;
            while ((len = fileReader.read(chars)) != -1) {
                // 输出内容
                String s = new String(chars, 0, len);
                System.out.println(s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源流
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Test
    public void write(){
        // 字符写入一个文件
        String src= "E:\\test\\hello.txt";
        FileWriter fileWriter = null;
        // 字符写入
        try {
            //fileWriter = new FileWriter(src);
            // 追加写入 加一个 true
            fileWriter = new FileWriter(src,true);
            //写入文件中
            String msg = "这个周末就要找房子，准备搬家了！就不用来回跑了";
            fileWriter.write(msg,0,msg.length());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源流
            if (fileWriter != null) {
                try {
                    fileWriter.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Test
    public void byteFile(){
        // 字节读取内容
        String src= "E:\\test\\hello.txt";
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(src);
            byte[] bytes = new byte[1024];
            int len;
            // 循环读取内容
            // len 返回实际读取内容的长度
            /**
             * 使用 read(byte[] b) 读到 字节数组。
             * 按照数组的长度进行最大长度读取字节
             * 返回读入缓冲的字节总数，返回 -1 表示读取内容结束
             * 比如：设定是 8，但是读取是6字节，就返回是6
             * len = 6
             */
            while ((len = fileInputStream.read(bytes)) != -1) {
                // 转成字符串类型
                String s = new String(bytes, 0, len);
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源流
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Test
    public void byteWrite(){
        // 字节写入内容
        String src= "E:\\test\\hello.txt";
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(src,true);
            // 写入内容
            // 需要把字符串转换成为 byte 类型才可以进行写入
            fileOutputStream.write("写入内容".getBytes());
            fileOutputStream.write("\\r\\n".getBytes());
            fileOutputStream.write("哈哈哈哈".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Test
    public void copy(){
        boolean isOne = false;
        if (isOne) {
            // 文件拷贝
            // 一边读一边复制操作
            // 方式一 ：使用输入输出流进行边读边复制
            String src = "E:\\test\\messi.jpeg";
            String target = "D:\\messi.jpeg";
            // 图片是二进制 使用字节操作
            // 读取内容 -- 输入流
            FileInputStream fileInputStream = null;
            FileOutputStream fileOutputStream = null;
            try {
                fileInputStream = new FileInputStream(src);
                fileOutputStream = new FileOutputStream(target);
                // 循环读取呢日用
                int len;
                byte[] bytes = new byte[1024];
                while ((len = fileInputStream.read(bytes)) != -1) {
                    // 写入操作
                    fileOutputStream.write(bytes,0,bytes.length);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 关闭流操作 -- 先开后关
                if (fileOutputStream != null) {
                    try {
                        fileOutputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fileInputStream != null) {
                    try {
                        fileInputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        // 字符文件复制 文本类型
        boolean isTxt = false;
        if (isTxt) {
            String src = "E:\\test\\hello.txt";
            String target = "D:\\hello.txt";
            /**
             * 1.读取文件内容
             * 2.复制文件内容
             */
            FileReader fileReader = null;
            FileWriter fileWriter = null;
            try {
                fileReader = new FileReader(src);
                fileWriter = new FileWriter(target);
                int ren;
                char[] chars = new char[1024];
                // 循环读取
                while ((ren = fileReader.read(chars)) != -1) {
                    // 边读边复制
                    fileWriter.write(new String(chars,0,ren));
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 关闭流 先开后关
                if (fileWriter != null) {
                    try {
                        fileWriter.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fileReader != null) {
                    try {
                        fileReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    @Test
    public void practice() throws IOException {
        // 实战复制文件
        String src = "E:\\test\\subject";
        // 获取目录的下面的文件列表
        File[] files = new File(src).listFiles();
        // 循环复制操作
        for (File file : files) {
            // 源 目标源
            Files.copy(Paths.get(file.getAbsolutePath()),Paths.get("D:\\subject\\"+file.getName()));
        }
    }
}
